package ar.drools.apuestas.main;

import java.util.List;

import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import ar.drools.apuestas.modelo.Piloto;
import ar.drools.apuestas.utils.HTMLParser;

public class Sistema {

	public List<Piloto> obtenerPrediccion(){
		
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "/drools-spring.xml" });
		StatefulKnowledgeSession session = (StatefulKnowledgeSession) context.getBean("kSession");

		List<Piloto> listaPilotos = insertFacts(session);
		session.dispose();
		return listaPilotos;
		
	}
	
	private List<Piloto> insertFacts(StatefulKnowledgeSession kSession) {
		FactHandle ruleHandle;
		List<Piloto> listaPilotos =  HTMLParser.obtenerPilotosConDatos(); 
		
		for (Piloto piloto : listaPilotos) {
			kSession.getAgenda().getAgendaGroup("procesamientoDatos").setFocus();
			ruleHandle = kSession.insert(piloto);
			kSession.fireAllRules();
			kSession.retract(ruleHandle);

			// reinserta el piloto y corre el segundo grupo de reglas (todas las de procesamiento de datos intermedios)
			kSession.getAgenda().getAgendaGroup("obtenerResultados").setFocus();
			ruleHandle = kSession.insert(piloto);
			kSession.fireAllRules();
			kSession.retract(ruleHandle);

			// reinserta el piloto y corre el ultimo grupo de reglas para obtener el resultado final
			kSession.getAgenda().getAgendaGroup("resultadoFinal").setFocus();
			ruleHandle = kSession.insert(piloto);
			kSession.fireAllRules();
			
			System.out.println(piloto);
		}
		
		return listaPilotos;
		
		
	}
}
